package pl.edu.pw.elka.tinyrepo.common;

import java.util.HashMap;
import java.util.Map;

/**
 * Rodzaje naglowkow dostepne w systemie. 
 * UWAGA: kolejnosc wypisywania HTTPHeadeType jest taka jak kolejnosc ich deklarowania. 
 * (wg. javadocu dla compareTo dla enumow)
 * Tak wiec Naglowki beda wypisywane w takiej kolejonosci, jak tu sa zadeklarowane.
 * Enum domyslnie implementuje interfejs Comparable<T>.
 * 
 * @author Piotr Jarosik
 */
public enum HTTPHeaderType {
   CONTENT_TYPE {
      public String toString() {
         return "Content-Type:"; 
      }
      
      public Boolean isProperValue(String value) {
         return true;
      }
   },
   CONTENT_LENGTH {
      public String toString() {
         return "Content-Length:";
      }
      
      public Boolean isProperValue(String value) {
         Integer test = null;
         try {
            test = new Integer(value);
         } catch (Exception e) {
            return false; // jak nie da sie utworzyc z value liczby to exception
         }
         if(test <= 0)
            return false;
         return true;
      }
   }, 
   /**
    * Dla redirect
    */
   LOCATION {
      @Override
      public String toString() {
         return "Location:";
      }
   },
   DESTINATION {
      @Override
      public String toString() {
         // TODO Auto-generated method stub
         return "Destination:";
      }
   }
   ; 
   
   /** Mapa przydatna zeby okreslic rodzaj enuma na podstawie stringa. 
    *   */
   private static final Map<String, HTTPHeaderType> getMap = 
                                    new HashMap<String, HTTPHeaderType>();
   
//   /** Numer porzadkowy poszczegolnych naglowkow - istotne przy wypisywaniu naglowkow.
//    *  UWAGA - kazdy kolejny naglowek musi miec unikalny numer porzadkowy. */
//   private Integer sequenceNumber;
   
   static {
      getMap.put("Content-Length:", CONTENT_LENGTH);
      getMap.put("Content-Type:", CONTENT_TYPE);
      getMap.put("Location:",LOCATION);
      getMap.put("Destination:", DESTINATION);
   }
   /**
    * Funkcja analogiczna do valueOf. Na podstawie stringa okresla enum.
    * (wprowadzona tylko z powodu "myslnika" w Headerach, ktorego java nie akceptuje w nazwach enumow,
    *  w przeciwnym razie mozna by bylo po prostu wywolac metode valueOf dla enuma).
    *  
    * @param string
    * @return odpowiedni enum lub null jezeli taki typ nie istnieje.
    */
   public static HTTPHeaderType getType(String string) {
         return getMap.get(string);
   }
   
   /**
    * Sprawdza czy value odpowiada prawidlowemu typowi
    * dla danego typu naglowka (np. dla CONTENT_LENGTH powinien to byc taki String, ktory 
    * da sie bez problemu przeksztalcic na inta).
    * 
    * @param value
    * @return
    */
   public Boolean isProperValue(String value) {
      return true;
   }
}
